Intouch在烟草行业自动化领域中的应用
2003/10/20 13:49:00
[摘要] 本文介绍在南通醋酸纤维有限公司《动力工段自控系统改造》项目中,分布式Intouch的应用,以及Intouch与SQLSERVER2000和其它应用程序共同组建整个管控系统。另外还介绍了一些Intouch组态的技巧。 1.系统简介 《动力工段自控系统改造》项目是对南纤公司原有动力工段的自控系统进行改造和优化。目标是充分利用原有软硬件资源,用最少的投入获得高效、安全的系统性能。 原动力工段包括:化水车间、冷冻空压车间(简称动力车间)、软水站及一二泵房车间,各自拥有自己的控制室。改造前,化水车间已采用了一套SIEMENS TI545 PLC和两台全点的INTOUCH操作站实现监控,泵房车间也已采用了一套SIEMENS TI545 PLC和两台256点的INTOUCH操作站实现监控,动力车间除5台压缩空气干燥器采用GE 90-30PLC控制外其余设备的监控均用盘装仪表实现。原动力工段系统结构如下图所示。 系统改造后,泵房车间和动力车间由原泵房车间的SIEMENS TI545 PLC控制(需增加一些卡件),化水车间在原系统基础上增加一些功能。将原有的两台全点INTOUCH和一台256点INTOUCH移入新设的集中控制室,实现三个车间的集中监控,在化水车间设一台256点INTOUCH操作站,供现场巡回检查时使用。同时系统通过一台新设的数据及Web服务器与公司管理网连接,公司和工段管理者可通过公司区域网获取生产过程的数据和报表。 2.系统功能及特点 2.1冗余的总线及操作站 系统包含2台全点的INTOUCH(SERVER1、SERVER2)和2台256点的INTOUCH(CLIENT1、CLIENT2),SERVER1、SERVER2分别通过各自的TIWAY卡与化水、泵房的PLC构成两条冗余的TIWAY总线。CLIENT1、CLIENT2则通过远程变量访问某台全点INTOUCH上的数据从而实现对现场的监控。通常CLIENT1、CLIENT2只与SERVER1、SERVE2中的一台通讯,当发生通讯故障时会自动尝试与另一台SERVER连接。INTOUCH中的“通讯状态”画面显示了各工作站、PLC及总线的当前状态。 图中红线表示操作站在线,黑色表示离线。在CLIENT1、CLIENT2的“通讯状态”画面中,工程师可以手动切换CLIENT与SERVER的连接。 2.2“瘦”操作站模式 256点的CLIENT通过远程变量访问全点的SERVER从而访问PLC,这样CLIENT的变量配置不超过256点。同时系统运用了“分布式报警”和“分布式历史趋势”等功能,所有的报警记录及历史趋势都存储在全点的SERVER上,CLIENT上显示的报警和历史趋势是从SERVER上获得的。可以说,SERVER充当了INTOUCH服务器而CLIENT是一个INTOUCH客户端,只需较低的配置即可。当切换SERVER时,“分布式报警”和“分布式历史趋势”也跟着自动切换。 1.“分布式报警”的设置 在INTOUCH组态中需用“分布式报警”控件,在控件的报警查询栏中输入“\\SERVER1\INTOUCH!DONGLI”,SERVER1为缺省连接的计算机名,DONGLI表示INTOUCH中的DONGLI报警组(报警组包括DONGLI、HS)。在SERVER的计算机属性需选中“本机将提供报警”;而在CLIENT的计算机属性中需选中“本机将显示报警”。运行时CLIENT将通过函数切换与SERVER的连接。 为了统一报警设置,我们将报警做在PLC的报警模块中通过对PLC变量“AHA(报警上限)、AHHA(报警上上限)、ALA(报警下限)、ALLA(报警下下限)、APV(报警过程值)、AVF(报警状态字)”的读写来判断和设置报警。有报警发生时,只有SERVER会将报警信息写入报警记录,SERVER2在写报警信息前先判断SERVER1是否在运行,以免重复写入。 2.“分布式历史趋势”的设置(以SERVER1为例) 在SERVER的INTOUCH组态中需将历史数据的存放路径设为INTOUCH默认路径。CLIENT的INTOUCH组态需在“分布式名称管理器”中的“分布式历史”里添加一项,供应器名称为“SERVER1”,路径为“\\SERVER1\D\NCFC2000S1”(工程路径)即可。在CLIENT中访问SERVER1的历史数据需写成“SERVER1.TAGNAME”。SERVER2的设置与SERVER1相同。 3.远程变量的引用 在CLIENT上使用远程变量只需在变量名前加计算机名即可,无需在标记名字典中新建变量,所以不占点数。(SERVER:TAGNAME) 4.自动切换功能 CLIENT通过远程变量观察SERVER上的$Second变量,若它在在一段时间内无变化则表明与SERVER的连接出现问题,这时可通过SetAccessName函数将CLIENT上的远程变量切换到另一台SERVER上。 2.3公用的操作窗口 系统中对于具有相同操作接口设备使用了公用的操作窗口,而不是对应每个设备都创建一个操作窗口,这样大大减少了窗口的数量。实现它需要用到间接变量,可以将间接变量看作一个指针,当对某个设备操作时,利用间接变量指向操作变量,这样,对间接变量的赋值就会作用到操作变量上,操作变量的变化也会反应到间接变量上。 以过滤水泵为例,在过滤水处理系统中,点击3#过滤泵,弹出操作窗口,如下图所示: 3#过滤泵的操作变量为“RUN-3#GLB(启动)”、“STOP-3#GLB(停止)”、“RL-3#GLB(反馈)”、“AUTO-3#GLB(自动)”、“REPAIR-3#GLB(检修)”点击过滤泵时执行语句: DL_START.NAME=RUN-3#GLB.NAME; DL_STOP.NAME=STOP-3#GLB.NAME; DL_RL.NAME = RL-3#GLB.NAME; AUTO.NAME = AUTO-3#GLB.NAME; DL_REPAIR.NAME=REPAIR-3#GLB.NAME; “DL_XXX”为间接变量。在操作窗口中只需对间接变量赋值即可。例如在“启动”按钮的动作属性中写到: IF DL_START.Name<>"NULL" AND DL_STOP.Name<>"NULL" THEN DL_START=1; DL_STOP=0; Record=DL_START.Comment; SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" ); //写操作纪录 ELSE IF DL_START.Name = = "NULL" THEN DL_STOP=0; Record=StringLeft( DL_STOP.Comment, StringLen( DL_STOP.Comment )/2 ); SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" ); ELSE DL_START=1; Record=StringLeft( DL_START.Comment, StringLen( DL_START.Comment )/2 ); SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" ); ENDIF; ENDIF; 因为设备的启停一般有两种:1.启动与停止是一个输出;2.启动与停止是两个输出。为一个输出时我们将输出变量的COMMENT属性写为“XXX启动XXX停止”这样,在写操作记录时需取COMMENT的左一半或右一半;若为两个输出时,变量的COMMENT将为“XXX启动”或“XXX停止”,写记录时取对应变量的COMMENT即可。 CLIENT的情况比较特殊,因为CLIENT需用间接变量指向远程变量,而远程变量的COMMENT无法赋给间接变量的COMMENT,所以为了在公用窗口中获得远程变量的COMMENT我们只能利用间接变量的NAME(即远程变量的NAME)在数据库中查找到COMMENT,再写操作记录。语句如下:(写记录的操作参见“数据库的应用”。注意:以下中文单引号请替换为英文单引号) IF DL_START.Name<>"NULL" AND DL_STOP.Name<>"NULL" THEN DL_START=1; DL_STOP=0; Record=StringRight( DL_START.Name ,StringLen( DL_START.Name )-7 ); SQLSelect( ConnectionId, "COMM", "COMMENT", "device_id="+"’"+Record + "’" , "" ); //查找COMMENT SQLFirst( ConnectionId ); Record=StringTrim( COM, 3 ); SQLEnd( ConnectionId ); SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" ); //写操作纪录 ELSE IF DL_START.Name=="NULL" THEN DL_STOP=0; Record=StringRight( DL_STOP.Name ,StringLen( DL_STOP.Name )-7 ); SQLSelect( ConnectionId, "COMM", "COMMENT", "device_id="+"’"+Record + "’" , "" ); SQLFirst( ConnectionId ); Record=StringTrim( COM, 3 ); Record=StringLeft( Record, StringLen( Record )/2 ); SQLEnd( ConnectionId ); SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" ); ELSE DL_START=1; Record=StringRight( DL_START.Name ,StringLen( DL_START.Name )-7 ); SQLSelect( ConnectionId, "COMM", "COMMENT", "device_id="+"’"+Record + "’" , "" ); SQLFirst( ConnectionId ); Record=StringTrim( COM, 3 ); Record=StringLeft( Record, StringLen( Record )/2 ); SQLEnd( ConnectionId ); SQLInsert( ConnectionId, "CortrolLog", "CortrolLog" ); ENDIF; ENDIF; 2.4数据库的应用 系统中的IBM服务器作为数据存储和发布的服务器,安装了SQL SERVER 2000,系统的报警历史记录和操作记录以及设备档案都存放在名为“DL” 的数据库中。 2.4.1 ODBC的连接 INTOUCH 通过ODBC访问SQL SERVER,在ODBC中建立名为“DL”的用户DSN,在INTOUCH中用语句: SQLConnect( ConnectionId, "DSN=DL"); 建立连接,若连接成功则ConnectionId > 0 。在执行每一条SQL语句时都会有一个返回值,若返回值为0则表示执行成功,否则表示与数据库连接不正常,需重新建立连接。为了时刻检测与数据库服务器的连接情况,在应用程序脚本中每5秒钟执行一条查询语句: IF ResultCode
提交
查看更多评论
其他资讯
超越传统直觉,MATLAB/Simulink助力重型机械的智能化转型
新大陆自动识别精彩亮相2024华南国际工业博览会
派拓网络被Forrester评为XDR领域领导者
智能工控,存储强基 | 海康威视带来精彩主题演讲
展会|Lubeworks路博流体供料系统精彩亮相AMTS展会